﻿#include "FWKeyboard.h"

FWKeyboard::FWKeyboard(FWGame* game)
{
	this->_gameObject = game;
	this->di8 = 0;
	this->did8 = 0;
	ZeroMemory(&buffer_key,sizeof(buffer_key));
}

FWKeyboard::~FWKeyboard(void)
{
}

bool FWKeyboard::init()
{
	HRESULT hr = DirectInput8Create(
		_gameObject->hInstance,//hinstance của chương trình
		DIRECTINPUT_VERSION,//tham số mặc định
		IID_IDirectInput8,//Có thể tự define
		(void**)&this->di8,//con trỏ nhận giá trị trả về
		NULL);//tham số dùng thêm
	if(FAILED(hr)) return false;
	//tạo bàn phím. GUID_SysKeyboard là chỉ bàn phím. Nếu bạn có một thiết bị cho riêng mình thì bạn phải định nghĩa nó trước
	hr = this->di8->CreateDevice(GUID_SysKeyboard,&this->did8,NULL);
	if(FAILED(hr)) return false;
	//set format nhận được
	hr = this->did8->SetDataFormat(&c_dfDIKeyboard);
	if(FAILED(hr)) return false;
	//loại hoạt động. DISCL_FOREGROUND nghĩa là chỉ hoạt động khi của sổ hWnd đang được handle
	hr = this->did8->SetCooperativeLevel(this->_gameObject->hwnd,DISCL_FOREGROUND| DISCL_NONEXCLUSIVE);
	if(FAILED(hr)) return false;
	DIPROPDWORD dipdw;
	dipdw.dwData = BUFFER_SIZE;
	dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
	dipdw.diph.dwSize = sizeof(DIPROPDWORD);
	dipdw.diph.dwObj = 0;
	dipdw.diph.dwHow = DIPH_DEVICE;

	hr = this->did8->SetProperty(DIPROP_BUFFERSIZE,&dipdw.diph);
	if(FAILED(hr)) return false;
	//Yêu cầu sử dụng thiết bị
	//Yêu cầu thiết bị
	hr = this->did8->Acquire();	
	return true;
}

void FWKeyboard::getState()
{
	//lay trang thai ban phim
	HRESULT hr = this->did8->GetDeviceState(sizeof(this->buffer_key),(void**)(this->buffer_key));
	if(FAILED(hr))
	{
		this->did8->Acquire();
	}
	this->dwElements = BUFFER_SIZE;
	hr = this->did8->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),this->_keyEvent,&dwElements,0);
}

bool FWKeyboard::isKeyDown(int key)
{
	return this->buffer_key[key] & 0x80;
}

void FWKeyboard::saveState()
{

	memcpy(this->buffer_key_old,this->buffer_key,sizeof(char)*256);
}

bool FWKeyboard::isKeyRelease(int key)
{
	return !(this->buffer_key_old[key] & 0x80);
}

bool FWKeyboard::isPreKeyDown(int key)
{
	return this->buffer_key_old[key] & 0x80;
}

bool FWKeyboard::isKeyPressed(int key)
{
	for(DWORD i = 0; i < dwElements; i++)
	{
		int state =  _keyEvent[i].dwData;
		int keycode = _keyEvent[i].dwOfs;
		if(keycode == key)
		{
			if(state & 0x80)
			{
				return true;
			}

		}
	}
	return false;
}
